// user 测试用例
var crypto = require('crypto')
var bcrypt = require('bcrypt')
// 获取随机字符串
function getRandomString(len) {
    // len 没有传，默认生成一个长度为16的字符串
     if (!len) len = 16
    return crypto.randomBytes(Math.ceil(len / 2)).toString('hex')
}

var should = require('should')
var app = require('../../app')
var mongoose = require('mongoose')
// 拿到 user 模型
// var User = require('../../app/models/user')
var User = mongoose.model('User')
// 写测试用例 test  每个 it 都要调用done()
// describe 描述一个单元测试开始 describe可以嵌套
var user
describe('<Unit Test', function () {
    // 测试 user 模型
     describe('Model User:' , function () {
         // 测试之前
         before(function (done) {
             user = {
               name: getRandomString(),  // 一个长度为16的字符串
               password: 'password'
             }
             done()
         })
         // save 方法调用之前
         describe('Before Method save:', function () {
             // 一个 it 代表一个测试用例, 单元指得就是 it
            it('should begin without test user', function (done) {
                User.find({name: user.name}, function (err, users) {
                    users.should.have.length(0) // 查不到用户
                    done()
                })
            })
         })
         // 
         describe('User save:', function () {
             // 一个 it 代表一个测试用例, 单元指得就是 it
             it('should save without problems', function (done) {
                 var _user = new User(user)
                 _user.save(function (err) {
                     should.not.exist(err) // 使用中不要有错误
                     _user.remove(function (err) {
                         should.not.exist(err)
                         done()
                     })
                 })
             })
             // 确认密码的生成是没有问题的
             it('should password be hashed correctly', function (done) {
                 var password = user.password
                 var _user = new User(user)
                 _user.save(function (err) {
                     should.not.exist(err) // 使用中不要有错误
                     _user.password.should.not.have.length(0)
                     // 比对密码 原始 password ，当前用户加密后的密码，回调方法
                     bcrypt.compare(password, _user.password, function (err, isMatch) {
                         should.not.exist(err)
                         isMatch.should.equal(true)
                         _user.remove(function (err) {
                             should.not.exist(err)
                             done()
                         })
                     })
                 })
             })
             // 权限应该是0
             it('should have default role 0', function (done) {
                 var _user = new User(user)
                 _user.save(function (err) {
                     should.not.exist(err) // 使用中不要有错误
                     _user.role.should.equal(0)
                     // 比对密码 原始 password ，当前用户加密后的密码，回调方法
                     _user.remove(function (err) {
                         // should.not.exist(err)
                         done()
                     })

                 })
             })
             // 用户名不能重复
             it('should  fail to save an existing user', function (done) {
                 var _user1 = new User(user)
                 _user1.save(function (err) {
                     should.not.exist(err) // user1能 save 成功
                     var _user2 = new User(user) // new user2
                     _user2.save(function (err) {
                         should.exist(err)
                         _user1.remove(function (err) { // 移除 user1
                             if (!err) {
                                 _user2.remove(function (err) { // 移除 user2
                                     done()
                                 })
                             }
                         })
                     })
                 })
             })
         })
         // after 之后自己还会有测试的
         after(function (done) {
             // clear user info
             done()
         })

     })
})